<html>

<head>
<title>Explay CMS - документация</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<style type="text/css" media="all">
.paragraph { padding-left: 40px; }
ul li { margin-top: 7px; }
.code { background: #CCCCCC; margin: 7px; padding: 4px 4px 4px 10px; }
h3 { text-decoration: underline; }
.funct { color: #003399; }
code { color: #336633; }
.tags { color: #FF9933; }

table th { background: #CCCCCC; }
</style>


</head>

<body vlink="blue" link="blue">
<h1>Explay CMS - документация для разработчиков</h1>

<small>Данная документация составлена для версии 2.1. Она постоянно модифицируется и дополняется. Последнюю версию можно посмотреть здесь <a href="http://explay.su/documentation.htm" />http://explay.su/documentation.htm</a></small>

<h1>Оглавление</h1>

<ol>
	<li><a href="#mod_rewrite">Правила mod_rewrite</a></li>
    <li><a href="#api">API</a>
    	<ol>
    	    <li><a href="#classes">Встроенные классы</a>
            	<ol>
                	<li><a href="#CORE">CORE</a></li>
                    <li><a href="#MySQL">MySQL</a></li>
                    <li><a href="#Templater">Templater</a></li>
                    <li><a href="#imageResize">imageResize</a></li>
                    <li><a href="#User">User</a></li>
					<li><a href="#explayForms">explayForms</a></li>
                </ol>
            </li>
	        <li><a href="#functions">Функции</a>
            	<ol>
                	<li><a href="#funct_strings">Строковые</a></li>
                    <li><a href="#funct_comments">Работа с комментариями</a></li>
                    <li><a href="#funct_files">Файловая система</a></li>
                    <li><a href="#funct_users">Пользователи</a></li>
                    <li><a href="#funct_html">Вывод HTML</a></li>
                    <li><a href="#funct_other">Остальные</a></li>
                </ol>
            </li>
        </ol>
     </li>
     <li><a href="#templates">Шаблоны</a>
     	<ol>
        	<li><a href="#templates_rules">Правила</a>
            	<ol>
                	<li><a href="#templates_permissions">Разделение прав</a></li>
                    <li><a href="#templates_include">Вставка файлов</a></li>
					<li><a href="#templates_groups">Группы шабонов</a></li>
                </ol>
            </li>
            <li><a href="#templates_main">Главные шаблоны</a></li>
        </ol>
     </li>
     <li><a href="#api_ajax">http API & AJAX</a>
     	<ol>
        	<li><a href="#http_api">http API</a></li>
            <li><a href="#ajax">AJAX</a></li>
        </ol>
     </li>
     <li><a href="#blocks">Блоки и панели</a></li>
	 <li><a href="#recomendations">Рекомендации по стилю кодирования</a></li>
     </li>
</ol>


<h1><a name="mod_rewrite"></a>Правила mod_rewrite</h1>
	<div class="paragraph">
		<table border="1" style="border-collapse:collapse; border-color:#CCCCCC">
        	<tr>
            	<th>Правило</th>
                <th/>
                <th>Реальный путь</th>
            </tr>
            
            <tr><td colspan="3"><strong>Основные:</strong></td></tr>
            
            <tr>
           		<td>/{модуль}/</td>
                <td>&rarr;</td>
                <td>index.php?name={модуль}</td>
            </tr>
            <tr>
           		<td>/{модуль}/{id}.html</td>
                <td>&rarr;</td>
                <td>index.php?name={модуль}&id={id}</td>
            </tr>
            <tr>
           		<td>/{модуль}/{раздел}/</td>
                <td>&rarr;</td>
                <td>index.php?name={модуль}&cat={раздел}</td>
            </tr>
            <tr>
           		<td>/{модуль}/{раздел}/{id}.html</td>
                <td>&rarr;</td>
                <td>index.php?name={модуль}&cat={раздел}&id={id}</td>
            </tr>
            <tr>
           		<td>/{модуль}/page{номер}/</td>
                <td>&rarr;</td>
                <td>index.php?name={модуль}&page={номер}</td>
            </tr>
            <tr>
           		<td>/{модуль}/{раздел}/page{номер}/</td>
                <td>&rarr;</td>
                <td>index.php?name{модуль}&cat={раздел}&page={номер}</td>
            </tr>
            
            <tr><td colspan="3"><strong>Статьи:</strong></td></tr>
            
            <tr>
           		<td>/{чпу_статьи}.html</td>
                <td>&rarr;</td>
                <td>index.php?name=articles&url={чпу_статьи}</td>
            </tr>
            
            <tr><td colspan="3"><strong>Изоображения:</strong></td></tr>
            
            <tr>
           		<td>/avatars/{id_пользователя}.gif</td>
                <td>&rarr;</td>
                <td>image.php?mod=avatar&id={id_пользователя}</td>
            </tr>
            <tr>
           		<td>/antibot.gif</td>
                <td>&rarr;</td>
                <td>image.php?mod=bot</td>
            </tr>
            
            <tr><td colspan="3"><strong>Авторизация:</strong></td></tr>
            
            <tr>
           		<td>/login.html</td>
                <td>&rarr;</td>
                <td>auth.php</td>
            </tr>
            <tr>
           		<td>/logout.html</td>
                <td>&rarr;</td>
                <td>auth.php?mod=out</td>
            </tr>
            
            <tr><td colspan="3"><a name="rule_api"></a><strong>http API & AJAX:</strong></td></tr>
            
            <tr>
           		<td>/api/{остальной_урл}</td>
                <td>&rarr;</td>
                <td>index.php?name=api&option={остальной_урл}</td>
            </tr>
            <tr>
           		<td>/ajax/{остальной_урл}</td>
                <td>&rarr;</td>
                <td>index.php?name=ajax&option={остальной_урл}</td>
            </tr>
        </table>
	</div>

<h1><a name="api"></a>API</h1>
<h2><a name="classes"></a>Встроенные классы</h2>
    <div class="paragraph">
    	<h3><a name="CORE"></a>CORE</h3>
        <p>Класс CORE предназначен для создания страницы на основе шаблона, заполнения контентом, ее вывода и контроля модулей.
        Этот класс незначительно используется в модулях, т.к. он более предназначен для системных нужд.</p>
        <strong>Публичные методы:</strong>
        <ul>
        	<li><u>Конструктор:</u> <code>__construct (<em>array</em> site_settings, <em>string</em> template_href, <em>string</em> theme_folder)</code><br>
			<strong>site_settings</strong> - массив настроек сайта ($SITE), <strong>template_href</strong> - имя шаблона старницы в папке
            <strong>theme_folder</strong>.</li>
            
            <li><code>CORE::set_page_title (string)</code> (статичный метод) - устанавливает заголовок сайта.
            В строке переданной методу обрабатывается псевдо-переменная <strong>{module_header}</strong>, заменяемая на заголовок модуля.</li>
            
            <li><code>CORE::set_keywords (string)</code> (статичный метод) - устанавливает набор ключевых слов.</li>
            
            <li><code>CORE::add_block (<em>string</em> $content, <em>string</em> $align)</code> (статичный метод) - добавляет блок с контентом <strong>content</strong>
            и позицией <strong>align</strong> (<em>left</em> или <em>right</em>).</li>
            
            <li><code>CORE::add_panel (<em>string</em> $content, <em>string</em> $align)</code> (статичный метод) - добавляет панель с контентом <strong>content</strong>
            и позицией <strong>align</strong> (<em>top</em> или <em>bottom</em>).</li>
            
            <li><code>CORE::body_replace (<em>string</em> param, <em>string</em> content)</code> (статичный метод) - заменяет <strong>param</strong> в
            HTML-коде страницы на контент <strong>content</strong>.</li>
            
            <li><code>session (<em>int</em> user_id, <em>string</em> user_group)</code> - обновляет сессию пользователя.
            <strong>user_id</strong> - id текущего пользователя, <strong>user_group</strong> - группа текущего пользователя.</code></li>
            
            <li><code>make_page ()</code> - создает страницу и заполняет контентом.</li>
            
            <li><code>controller ()</code> - определяет запрошенный модуль или дефолтное действие.</li>
        </ul>
        
        <h3><a name="MySQL"></a>MySQL</h3>
        <p>Класс MySQL представляет базовый интерфейс для работы c БД MySQL. В нем имеется встроенный обработчик ошибок, позволяющий администратору
        сайта оперативно найти место и причину ошибки.</p>
        <strong>Публичные методы:</strong>
        <ul>
        	<li><code>MySQL::getInstance ()</code> (статичный метод) - возвращает объект MySQL.</li>
            <li><code>connect ()</code> - создание подключения.</li>
            <li><code>query (string), fetch_array (resource), ferch_row (resource), num_rows (resource)</code> - аналоги встроенных в PHP функций.</li>
           	<li><code>past_work_time ()</code> - возвращает фремя обработки всех SQL-запросов.</li>
            <li><code>past_count_queries ()</code> - возвращает количество SQL-запросов.</li>
        </ul>
        
        <h3><a name="Templater"></a>Templater</h3>
        <p>Класс для работы с шаблонами. Подробнее о шаблонах см. <a href="#templates">Шаблоны</a>.</p>
        <strong>Публичные методы (все статичные):</strong>
        <ul>
            <li><a name="load"></a><code>load (<em>string</em> template [, <em>bool</em> auto_clear)</code> - загружает группу (см. <a href="#templates_groups">группы шабонов</a>) шаблонов и разбивает ее на части, к каждой из которых
			можно обращаться как к отдельному шаблону (см. <a href="#display_part">display_part</a>). <strong>template</strong> - путь к
			файлу шаблона относительно папки с шаблонами. <strong>auto_clear</strong> - необязательный параметр, по-умолчанию равный <em>false</em>,
			установка значения которого в <em>true</em> указывает на то, что не надо сбрасывать загруженные до этого части других групп шаблонов.</li>
			<li><code>set_var (<em>string</em> var, <em>string</em> value)</code> - устанавливает переменную с именем <strong>var</strong>
            и значением <strong>value</strong> (<strong>value</strong> может так же являться двумерным массивом). После вывода шаблона все установленные переменные удаляются, кроме статичных (см. далее).</li>
            <li><code>set_static_var (<em>string</em> var, <em>string</em> value)</code> - устанавливает сатаичную переменную, по аналогии с
            set_var (), которая действует во всех шаблонах.</li>
            <li><code>display (<em>string</em> template [, <em>bool</em> auto_clear])</code> - возвращает обработанный, на основе файла <strong>template</strong> в папке
            с шаблонами, шаблон. Второй параметр <strong>auto_clear</strong> указывает на то, надо сбрасывать переменные после обработки или нет.
            По умолчанию <strong>auto_clear</strong> установлен в значении <em>false</em> (переменные, установленные <code>set_var</code>, сбрасываются).</li>
            <li><a name="display_part"></a><code>display_part (<strong>string</strong> part_name)</code> - возвращает обработанную часть шаблона, который загружен методом <code>load</code>.
			<strong>part_name</strong> - название части шаблона.</li>
			<li><code>past_count ()</code> - возвращает количество загруженных шаблонов.</li>
        </ul>
        
        <strong>Публичные переменные (все статичные):</strong>
        <ul>
        	<li><strong><em>string</em> path</strong> - полный путь до папки с шаблонами (без завершающего слеша).</li>
			<li><strong><em>int</em> user_id</strong> - id текущего пользователя</li>
            <li><strong><em>int</em> author_id</strong> - id "автора" (см. <a href="#templates_rules">правила</a>).</li>
        </ul>
        
        <strong>Пример:</strong>
        <div class="code">
<pre>define ('TEMPLATES_PATH', $_SERVER['DOCUMENT_ROOT'].'/themes/default');
$template = Templater::getInstance ();

$template->set_var ('{HEADER}', 'Заголовок');
$template->set_var ('{BODY}', 'Текст');

print $template->display ('table.tpl');</pre>
        </div>
        
      <h3><a name="imageResize"></a>imageResize</h3>
        <p>Класс, изменяющий размеры изоображения.</p>
        <strong>Публичные методы:</strong>
        <ul>
        	<li><u>Конструктор:</u> <code>__construct (<em>string</em> old_src, <em>string</em> new_name [, <em>string</em> new_dir,
            <em>array</em> max_size, <em>bool</em> save_type, <em>int</em> compress])</code><br /><strong>old_src</strong> - полный путь до
            изменяемого файла, <strong>new_name</strong> новое имя файла (без расширения). Необязательные параметры: <strong>new_dir</strong> - папка, куда
            будет записан новый файл (по умолчанию <em>$_SERVER['DOCUMENT_ROOT']</em>),
            <strong>max_size</strong> - одномерный массив со значениями максимальной ширины и высоты, <strong>save_type</strong>
            - параметр, установка значения которого в <em>true</em>, включит создание файла с форматом родительского изоображения (по умолчанию
            эта функция отключена), <strong>compress</strong> - значение уровня качества нового JPEG-изоображения (по умолчанию 70).
   		  </li>
            
            <li><code>resize ()</code> - функция изменяющая размеры изоображения. Возвращает true, если изоображение изменено и сохранено успешно;
            в противном случае возвращает false;</li>
      </ul>
        
        <strong>Пример:</strong>
        <div class="code">
<pre>try {
    $avatar = new imageResize ('image/avatars/123.jpg', '123_small', 'images/avatars', array (30,30), true, 100);
    if ($avatar->resize ())
        site_message ('Изоображение сохранено!');
    else
        site_error ('Неизвестная ошибка при сохранении изоображения!');
}
catch (Exception $e) {
    site_error ('Ошибка при сохранении изоображения: '.$e->getMessage());
}</pre>
        </div>
		
        <h3><a name="User"></a>User</h3>
        
        Класс для базовых действий с пользователем: вход, выход, авторизация.<br>
		Все методы и свойства класса <strong>статичные</strong>.
        
        <strong>Публичные методы:</strong>
        <ul>
        	<li><code>User::build ()</code> авторизует и возвращает массив с свойсвами текущего пользователя.</li>
            
            <li><code>User::login ()</code> выполняет авторизацию, установку cookies и перенаправляет пользователя.</li>
            
            <li><code>User::logout ()</code> выполняет очистку cookies с логином и паролем текущего пользователся.</li>
			
			<li><code>User::get_user (<em>mixed</em> var)</code> возвращает массив со свойствами пользователя. <b>var</b> - id или логин необходимого пользователя.</li>
        </ul>
        
        <strong>Публичные свойства:</strong>
        <ul>
        	<li><code>User::$properties</code> - массив свойств текущего пользователя.</li>
        </ul>
        
		<h3><a name="explayForms"></a>explayForms</h3>
		Класс для работы с веб-фомами.
</div>

<h2><a name="functions"></a>Функции</h2>
    <div class="paragraph">
    	
        <h3><a name="funct_strings"></a>Строковые</h3>
       	<ul>
        <li><strong class="funct">format_time (<em>int</em> time)</strong> возвращает отформатированную строку с временем.</li>
        
        <li><strong class="funct">str_to_lower (string)</strong> - аналог PHP-функции strtolower ().</li>
        
        <li><strong class="funct">expl_hash(string)</strong> возвращает закодированную доступным способом строку.</li>
        
        <li><strong class="funct">clear_danger_html (string)</strong> убирает из строки HTML-атрибуты типа <em>onClick, onChange</em> и т.д.</li>
        
        <li><strong class="funct">n2br (string)</strong> заменяет \r\n на &lt;br /&gt;</li>
        
        <li><strong class="funct">input_video (string)</strong> заменяет специальные видео-теги на flash-плееры некотрых сервисов.</li>
        
        <li><strong class="funct">replace_symbols (string)</strong> подготавливает строку к выводу в textarea.</li>
        
        <!--<li><strong class="funct"></strong></li> -->
        
        </ul>
        
        
        <h3><a name="funct_comments"></a>Работа с комментариями</h3>
        <ul>
        <li><strong class="funct">add_comment (<em>string</em> name, <em>string</em> mail, <em>string</em> body, <em>string</em> module,
        <em>int</em> id, <em>string</em> code)</strong> добавляет комментарий к контенту <strong>id</strong>.
        <strong>name</strong> - имя незарегистрированного пользователя, <strong>mail</strong> - его e-mail, <strong>body</strong>
        - текст комментария, <strong>module</strong> - латинское название модуля, <strong>code</strong> - введенный пользователем код CAPTCHA.</li>
        
        <li><strong class="funct">print_comments (<em>string</em> module, <em>int</em> id, <em>string</em> url [, <em>string</em> sort])</strong>
        выводит комментарии. <strong>module</strong> - латинское название модуля, <strong>id</strong> - индентификатор контента
        к которому были добавлены комментарии, <strong>url</strong> - адрест страницы, на которой выводятся комментарии.
        <strong>sort</strong> - необязательный параметр, задающий порядок сортировки комментариев.
        Может принимать значение только <em>DESC</em>.</li>
        
        </ul>
        
        <strong>Пример:</strong>
        <div class="code">
<pre>print '&lt;a name="comments"&gt;&lt;/a&gt;
      &lt;div id="comments_div"&gt;';

print_comments ('articles', $id, "/articles/{$artice_id}.html");

print '&lt;/div&gt;';

if (isset ($_POST['com_body']) && is_registered ())
	add_comment ('', $GLOBAL_USER['user_email'], $_POST['com_body'], 'articles', $artice_id, $_POST['captcha']);</pre>
        </div>
        
        
        <h3><a name="funct_files"></a>Файловая система</h3>
        <ul>
        <li><strong class="funct">is_cached (<em>string</em> filename, <em>int</em> time)</strong> проверяет удволетворяет ли файл <strong>filename</strong>
        (в папке <em>include/cache/</em>) "сроку годности" <strong>time</strong> (в секундах). В случае если файл создан не раньше <strong>time</strong>
        секунд назад, то функция возвращает <em>true</em>, в противном случае <em>false</em>.</li>
        
        <li><strong class="funct">cache_file (<em>string</em> filename, <em>string</em> content)</strong> создает (перезаписывает) файл с именем <strong>filename</strong>
        (в папке <em>include/cache/</em>) и заполняет его контентом <strong>content</strong>.</li>
        
        <li><strong class="funct">clear_cache ()</strong> очищает папку <em>include/cache/</em></li>
        </ul>
        
        
        <h3><a name="funct_users"></a>Пользователи</h3>
        <ul>
        <li><strong class="funct">my_karma ()</strong> возвращает рейтинг текущего пользователя. Для незарегистрированных пользователей он равен 0.</li>
        
        <li><strong class="funct">user_status (<em>int</em> id)</strong> возвращает картинку со статусом пользователя <strong>id</strong>.</li>
        
        <li><strong class="funct">is_registered (), is_admin (), is_moderator ()</strong> возвращают
        <em>true</em>, если текущий пользователь принадлежит соответствующей группе (зарегистрирован, администратор, модератор).</li>
        </ul>
        
        
        <h3><a name="funct_html"></a>Вывод HTML</h3>
        <ul>
        <li><strong class="funct">site_message (string)</strong> - сообщение об успешном действии. Шаблон: <em>site_message.tpl</em></li>
        
        <li><strong class="funct">site_error (string)</strong> - сообщение об ошибке. Шаблон: <em>site_error.tpl</em></li>
        
        <li><strong class="funct">past_table (<em>string</em> header, <em>string</em> body)</strong> выводит таблицу. Шаблон: <em>table.tpl</em></li>
        
        <li><strong class="funct">simple_table (string)</strong> выводит текст в шаблоне <em>simple_table.tpl</em></li>
        
        <li><strong class="funct">pst_com_table (<em>string</em> url, <em>string</em> module, <em>int</em> content_id)</strong> выводит
        форму для добавления комментария. <strong>url</strong> - текущий адрес, <strong>module</strong> - латинскок название модуля,
        <strong>content_id</strong> - id контента (например, статьи). Шаблон: <em>add_comment.tpl</em></li>
        </ul>
        
        
        <a name="funct_other"></a><h3>Остальные</h3>
        <ul>
        <li><strong class="funct">past_pages (<em>int</em> start, <em>int</em> number, <em>int</em> count, <em>string</em> url [,
        <em>string</em> get_start_name, <em>string</em> after_url, <em>bool</em> admin_panel])</strong> возвращает
        список ссылок на страници. <strong>start</strong> - начальный элемент, <strong>number</strong> - количество элементов на странице,
        <strong>count</strong> - общее количество элементов, <strong>url</strong> - базовый URL-адрес. Необязательные параметры:
        <strong>get_start_name</strong> - имя переменной страницы (по-умолчанию <em>page</em>, используется восновном в панели администратора или
        для комментариев), <strong>after_url</strong> - дополнительные GET-параметры. В случае установки <strong>admin_panel</strong> в значение
        <em>true</em> URL-адрес будет изменен в формат панели администратора.</li>
        
        <li><strong class="funct">count_smth (<em>int</em> number, <em>array</em> case)</strong> возвращает строку с нуженым падежом числа <strong>number</strong>
        из массива <strong>case</strong> (0 - именительный, 1 - родительный, 2 - творительный).
        <p><strong>Пример:</strong> этот код выведет "<em>21 комментарий</em>"</p>
        <div class="code"><pre>print count_smth (21, array ('комментрарий','комментария','комментариев'));</pre></div>
        </li>
        
        <li><strong class="funct">count_smth2 ()</strong> - аналог <strong>count_smth ()</strong>, только без самого числа в результате.</li>
        
        <li><strong class="funct">error_404 (), error_500 (), error_403 ()</strong> - вывод соответствующих ошибок.</li>
        
        <li><a name="function_get"></a><strong class="funct">_get (<em>int</em> number [, <em>string</em> param])</strong> возвращает значенние
        псевдо-переменной из адресной строки. Псевдо-переменные находятся в строке вида <em>param1/param2/param3/...</em>. По умолчанию эта строка
        берется из переменной <em>option</em> (<strong>param</strong>), переданной в заголовке (<em>http://example.com/?option=param1/param2/param3</em>).
        Например следующий код вернет <em>blog</em> (<em>http://example.com/index.php?name=api&amp;option=articles/blog/humor</em> или согласно <a href="#rule_api">правилу
        mod_rewrite</a> <em>http://exmple.com/api/articles/blog/humor</em>)
        <div class="code">
<pre>return _get(2);</pre>        
</div>	
		Эта функция в основном используется в модуле <a href="#http_api">http API</a>.
        </li>
        </ul>
       
    </div>
    
<h1><a name="templates"></a>Шаблоны</h1>
см. класс <a href="#Templater">Templater</a>.<br>
Файлы шаблонов находятся в папке <em>themes/имя_темы_оформления/</em>
<h2><a name="templates_rules"></a>Правила</h2>

	<div class="paragraph">
    	<h3><a name="templates_permissions"></a>Разделение прав</h3>
        В системе существует 4 группы пользователей: гости, зарегистрированнные, модераторы и администраторы. Для каждой из этих групп можно настраивать
        права на просмотр участков HTML-кода в шаблонах. Для этого необходимо выделить нужный участок специальными тегами:
        
        <ul>
        <li><code class="tags">&lt;unregister&gt;&lt;/unregister&gt;</code> - выделенный код будет виден только незарегистрированным пользователям.</li>
        
        <li><code class="tags">&lt;register&gt;&lt;/register&gt;</code> - код будет виден всем кроме незарегистрированных пользователей.</li>
        
        <li><code class="tags">&lt;moderator&gt;&lt;/moderator&gt;</code> - код будет виден модераторам и администраторам.</li>
        
        <li><code class="tags">&lt;admin&gt;&lt;/admin&gt;</code> - код будет виден только администраторам.</li>
        
        <li><code class="tags">&lt;author&gt;&lt;/author&gt;</code> - тег сравнивает свойства класса <strong>user_id</strong> и <strong>author_id</strong>.
        Если они равны, то код, кроме модераторов и администраторов, будет показан текущему пользователю (с id равным <strong>user_id</strong>).</li>
        </ul>
        
        <h3><a name="templates_include"></a>Вставка файлов</h3>
        В шаблоны можно подключать сторонние файлы из папки с остальными шаблонами текущей темы оформления. Для этого используется тег
        <code class="tags">&lt;include="имя_файла"&gt;</code>. Например, для того чтобы подключить таблицу стилей в шаблон главной страницы необходимо
        вставить следующий код в участок между тегами <em>&lt;head&gt;&lt;/head&gt;</em>:
        <div class="code">
<pre>...
&lt;include="style.css"&gt;
...</pre></div>

		<h3><a name="templates_groups"></a>Группы шаблонов</h3>
		Для упрощения работы с группами схожих шаблонов существуют <em>групповые шаблоны</em> - это шаблоны, содержащие в одном файле несколько частей
		являющихся отдельными шаблонами. Групповые шаблоны обрабатываются методами <a href="#load">Templater::load ()</a> и <a href="#display_part">Templater::display_part ()</a>.
		<p>Для разделения шаблонов в группе используется следующая конструкция:
		<code class="tags">&lt;--part:название_шаблона--&gt; шаблон &lt;--/part:название_шаблона--&gt;</code></p>		
		<p>Пример:<div class="code">
<pre><strong>template.tpl</strong>

&lt;--part:main--&gt;
&lt;ul&gt;{$list}&lt;/ul&gt;
&lt;--/part:main--&gt;

&lt;--part:item--&gt;
&lt;li&gt;{$text}&lt;/li&gt;
&lt;--/part:item--&gt;

<strong>file.php</strong>

Templater::load ('template.php');
$list = '';

for ($i=0; $i<5; $i++) {
	Templater::set_var ('text', $i);
	$list .= Templater::display_part ('item');
}

Templater::set_var ('list', $list);
print Templater::display_part ('main');
</pre></div></p>

    </div>
    
<h2><a name="templates_main"></a>Главные шаблоны</h2>
	<div class="paragraph">
    Главные шаблоны - это шаблоны, ипользуемые ядром (<a href="#CORE">CORE</a>) системы.<br>
    Единственное отличие главных шаблонов от обычных то, что в них есть функция вставки PHP-кода. Эту функцияю реализует специальны тег
    <code class="tags">&lt;include_php="имя_файла"&gt;</code>, недоступный в обычных шаблонах. В качестве параметра для этого тега должень быть путь к
    PHP-файлу от корня сайта, например, <em>include/blocks/menu.php</em>.
    
    <p><strong>Зарезервированные переменные главных шаблонов:</strong> {BODY}, {LEFT_BLOCKS}, {RIGHT_BLOCKS}, {TOP_PANELS}, {BOTTOM_PANELS}, {SECOND_NAVIGATION}, {TITLE},
    {KEYWORDS}, {DESCRIPTION}.</p>
    </div>
    
<h1><a name="api_ajax"></a>http API & AJAX</h1>

<h2><a name="http_api"></a>http API</h2>
	<div class="paragraph">
    	В Explay CMS http API предназначен для "облегченного" доступа к некоторым функциям, которые не должны отдаваться пользователю в виде полноценной html-страницы.
        Примером http API является RSS-лента или версия для печати статьи. Доступ к API-модулю представлен через зарезервированное значение параметра
       	<em>$_GET['name']</em>. Пример: <em>http://example.com/api/rss/comments/12/</em>. Вся строка после параметра <strong>api</strong> будет
        отдана API-модулю как <em>$_GET['option']</em>. Модуль API находится в <em>modules/api</em>.
        <p>Для обработки переданных параметров используется функция <a href="#function_get">_get()</a>.</p>
        <p>В папке <em>modules/api</em> находится файл <em>map.txt</em>, который сопоставляет параметр <em>_get(1)</em> с запрашиваемым файлом.</p>
    </div>

<h2><a name="ajax"></a>AJAX</h2>
	<div class="paragraph">
    	Модуль, аналогичный API. Находится в <em>modules/ajax</em>.
    </div>


<h1><a name="blocks"></a>Блоки и панели</h1>
	<div class="paragraph">
    	Блоки и панели находятся в <em>include/blocks</em>. Контент блока в код стараницы можно вставить следующими способами:
        <ul>
        	<li>Если блок (панель) создан в панели администратора, то ему передается переменная <strong>align</strong>, указывающая на его позицию на странице
            (справа или слева - для блоков, top или bottom - для панелей):
            <div class="code">
<pre>&lt;?php

$content = 'текст блока';

// для блоков
if ($align == 'left')
	CORE::add_block ($content, 'left');
elseif ($lign == 'right')
	CORE::add_block ($content, 'right');

// для панелей
elseif ($align == 'top')
	CORE::add_panel ($content, 'top');
else
	CORE::add_panel ($content, 'bottom');

?&gt;</pre>
			</div>
            </li>
            <li>Если блок (любой другой файл) подключается из шаблона, то ему передается переменная <strong>replace</strong>, которую блок должен заменить
            на свой контент:
            <div class="code">
<pre><em><strong>шаблон</strong></em>

&lt;!-- HTML --&gt;

&lt;include_php="include/blocks/menu.php"&gt;

&lt;!-- HTML --&gt;


<em><strong>файл include/blocks/menu.php</strong></em>

CORE::body_replace ($replace, $menu_content);</pre>
            </div>
            </li>
        </ul>
    </div>

<h1><a name="recomendations"></a>Рекомендации по стилю кодирования</h1>
    <div class="paragraph">
    	Для разработчиков не установлены жесткие рамки стиля кодирования, но будет лучше, если Вы будете придерживаться следующих правил:
        <ul>
			<li>Названия переменных и функций:
				<ul>
					<li>называть переменные понятными короткими именами</li>
					<li>использовать сомвол подчеркивания для разделения слов. Например, <em>$article_tags</em> вместо <em>$articleTags</em></li>
					<li>желательно использовать заглавные буквы в названиях классов. Например, <em>imageResize</em> вместо <em>image_resize</em></li>
					<li>константы должны быть в верхнем регистре</li>
				</ul>
			</li>
			<li>cоветы по работе с переменными в шаблонах:
				<ul>
					<li>называть их понятными латинскими названиями;</li>
					<li>для выделения переменной из текста использовать фигурные скобки <em>{}</em>;</li>
					<li>использовать знак подчеркивания вместо пробелов.</li>
				</ul>
			Следубщие варианты не желательны: <em>{header 1}, {заголовок}, %HEADER%, --header--</em>
			</li>
			<li>использовать ординарные кавычки (') вместо двойных (") в строках без переменных и специальных символов</li>
			<li>при обращении к ключам многомерных массивов записывать их в ординарных кавычках. Пример: <em>$_GET['module']</em></li>
			<li>при написании кода использвать табуляцию для отступа слева вместо пробелов</li>
            <li>рекомендуется комментировать код с использованием следующего стиля:
            <div class="code">
<pre>/**
 * Некий метод
 *
 * Длинное полное описание метода
 * на нескольок строк
 *
 * @param string $html переменная на входе &lt;---- переменные на входе
 * @param boolean $save доп. переключатель
 * @return string                          &lt;---- переменная на выходе
 */</pre>      
</div></li>
		</ul>
    </div>
	
<p style="border-top: silver 1px solid; text-align:center">&copy; <a href="http://explay.su">Explay CMS</a> 2008</p>

</body>

</html>